package com.stillalive.mybatis.mapper;

import org.apache.ibatis.annotations.*;
import com.stillalive.mybatis.model.UserInfo;

import java.util.List;
// 交给Spring进行管理 - 暂时注释掉以避免与UserInfoMapperXML冲突
@Mapper
public interface UserInfoMapper {

    // 将字段和属性一一对应
    @Results(id = "BaseMap", value = {
            @Result(column = "delete_flag", property = "deleteFlag"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })

    // 这里的映射会影响到其他mapper的映射，因为会扫描所有的@Mapper
//    // 快捷复用
//    @ResultMap(value="BaseMap")
    @Select("select * from user_info")
    List<UserInfo> selectAll();

    // 绑定参数（将传递的参数名绑定为Param中声明的参数名）
    @Select("select * from user_info where id = #{id}")
    // 这里也可以使用List<UserInfo>，但是如果返回结果大于一个的时候，必须要使用List<UserInfo>，否则会报错
    // 如果存在多个参数，参数的顺序不重要，但参数名字一定要相同
    // 只有一个参数时参数名可以不完全对应，但是存在多个参数时一定要名称对应
    UserInfo selectById(Integer id);

    // 此时也会查询成功，因为mybatis会默认生成两个参数param1和param2与传入的参数进行对应，此时可以正常绑定这两个参数
    // 不建议使用，可读性差；易出错
    @Select("select * from user_info where username = #{param2} and password = #{param1}")
    // 使用@Param注解，将username重命名为Username（传参过程中使用，类似于前后端交互时参数重命名？）
    // List<UserInfo> selectByUsernameAndPassword(String password, @Param("Username")String username);
    List<UserInfo> selectByUsernameAndPassword(String password, String username);

    @Insert("insert into user_info(username, password, age) values(#{username}, #{password}, #{age})")
    Integer insert(UserInfo userInfo);


    // 将id字段设置为自增的
    @Options(useGeneratedKeys = true, keyProperty = "id")
    // 这里添加@Param注解后直接匹配不上，需要加.
    @Insert("insert into user_info(username, password, age)" +
            "values(#{userInfo.username}, #{userInfo.password}, #{userInfo.age})")
    Integer insert1(@Param("userInfo") UserInfo userInfo);


    // 删除元素
    @Delete("delete from user_info where id = #{id}")
    Integer deleteById(Integer id);

    @Update("update user_info set delete_flag = #{deleteflag}, phone = #{phone} where id = #{id}")
    Integer updateUser(UserInfo userInfo);
}